package com.wildeman.plis.core.disparadores;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DisparadorFechaHora extends Disparador 
{
	private static final int CADA_HORA = 60;     //60 minutos
	private static final int CADA_DIA = 60 * 24; //60 minutos * 24 horas
	
	
	
	/**
	 * Obligatorio
	 */
	private Date fechaInicio; 
	
	/**
	 * Opcional. Intervalo de repeticion en minutos. Si no se informa indica que no tiene repetición
	 * Valor por defcto: 0 
	 */
	private int repetir_cada_mins;

	
	public DisparadorFechaHora() 
	{
		super();
		this.fechaInicio = new Date();
		this.repetir_cada_mins = 0;
	}
	
	
	
	/*-------------------------------------------------------------------------------------------
	 * Métodos publicos del disparador 
	 *-------------------------------------------------------------------------------------------*/
	/**
	 * Establece el disparador para que se repita cada cierto tiempo a partir de la hora indicada 
	 * @param hora_inicio. Las horas van entre 0 y 23, donde la medianoche es 0 y el medio día 12.
	 * @param minutos_inicio. Los minutos van entre 0 y 59.
	 * @throws Exception
	 */
	private void estableceHoras(int hora_inicio, int minutos_inicio, int repetir_minutos) throws Exception
	{
		if ( (hora_inicio <= 23 && hora_inicio >= 0) && (minutos_inicio <= 59 && minutos_inicio >= 0) )
		{
			//hora inicio
			Calendar cal = new GregorianCalendar();
			cal.setTimeInMillis(this.fechaInicio.getTime());
			
			cal.add(Calendar.HOUR_OF_DAY, hora_inicio-1);
			cal.set(Calendar.MINUTE, minutos_inicio);
			cal.set(Calendar.SECOND, 0);
			
			fechaInicio.setTime(cal.getTimeInMillis());
			
			this.repetir_cada_mins = repetir_minutos;
		}
		else
		{
			throw new Exception ("Rango de parámetros incorrecto. hora de 0 a 23 y minutos de 0 a 59");
		}
		
		
	}
	
	/**
	 * Establece el disparador Todos los dias a una hora y minutos dados
	 * @param hora Las horas van entre 0 y 23, donde la medianoche es 0 y el medio día 12.
	 * @param minutos Los minutos van entre 0 y 59.
	 * @throws Exception
	 */
	public void todosLosDiasALas(int hora, int minutos) throws Exception
	{
		estableceHoras(hora, minutos, DisparadorFechaHora.CADA_DIA);
	}
	
	
	public void cadaHoraA(int minutos) throws Exception
	{
		//Calcula la siguiente hora en función de la hora actual
		//y los minutos transcurridos hasta ahora.
		Calendar cal = new GregorianCalendar();
		cal.setTimeInMillis(this.fechaInicio.getTime());
		
		if (cal.get(Calendar.MINUTE) >= minutos)
		{
			cal.add(Calendar.HOUR_OF_DAY, 1);
		}
		else
		{
			cal.add(Calendar.HOUR_OF_DAY, 0);
		}
		
		estableceHoras(cal.get(Calendar.HOUR_OF_DAY), minutos, DisparadorFechaHora.CADA_HORA);
	}
	
	
	
	
	
	public int obtenerRepeticion()
	{
		return this.repetir_cada_mins;
	}

	@Override
	public String toString() 
	{
		return "Disparador '" + super.getNombreDisparador() + "' Id: " + super.getId() + " FechaHora_inicio: " + this.fechaInicio.toString() + " Repite_cada: " + obtenerRepeticion() + " minutos";
	}
	
	
	
	


}
